#include <iostream>
#include <string>

template <class NameType, class AgeType = int>
class Person
{
public:
    Person(NameType name, AgeType age)
    {
        this->name = name;
        this->age = age;
    }

    void showPerson()
    {
        std::cout << "name:" << this->name << " age:" << this->age << std::endl;
    }

    NameType name;
    AgeType age;
};

// 类模板和函数模板的区别
// 1. 类模板没有自动类型推导的使用方式
void test01()
{
    // Person p1("jack", 18); // 错误，类模板不能使用自动类型推导
    Person<std::string, int> p1("jack", 18);    // 类模板可以使用显示指定类型
    p1.showPerson();
}  
// 2. 类模板在模板参数列表中可以有默认参数
void test02()
{
    Person<std::string> p2("rose", 19);
    p2.showPerson();
}

int main()
{
    test01();
    test02(); 
    return 0;
}